package com.atguigu.tingshu.album.api;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.IdUtil;
import com.atguigu.tingshu.album.config.MinioConstantProperties;
import com.atguigu.tingshu.common.result.Result;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

@Tag(name = "上传管理接口")
@RestController
@RequestMapping("api/album")
public class FileUploadApiController {

//    @Autowired
//    private MinioConstantProperties minioConstantProperties;
    @Autowired
    MinioClient minioClient;
    /*
        优化：
            为了方便文件管理，可以用时间日期创建目录管理文件
            雪花算法生成文件名称
                - 引入三方依赖： hutool包
        配置常量类使用优化：
                不需要装配直接使用
     */
//    public static void main(String[] args) {
//        DateTime dateTime = new DateTime();
//        System.out.println(dateTime.toString("/yyyy/MM-dd/"));
//        long id = IdUtil.getSnowflakeNextId();
//        System.out.println("id = " + id);
//
//        String fileName = "adssad.jpg";
//        System.out.println(fileName.substring(fileName.lastIndexOf(".")));
//    }
    ///api/album/fileUpload
    @Operation(summary = "文件上传")
    @PostMapping("fileUpload")
    @SneakyThrows
    public Result fileUpload(MultipartFile file){//前端上传文件时  表单项名称必须 和后端接收参数一致 才可以默认接收
        //上传到Minio
        //1、获取Minio的客户端对象
        //2、通过客户端配置上传参数 上传
//        String fileName = UUID.randomUUID().toString().replace("-","")+
//                "_"+file.getOriginalFilename();
        String fileName = new DateTime().toString("yyyy/MM-dd/")+
                IdUtil.getSnowflakeNextId()+
                file.getOriginalFilename().substring(file.getOriginalFilename()
                        .lastIndexOf("."));
        minioClient.putObject(PutObjectArgs.builder()
//                        .bucket(minioConstantProperties.getBucketName())
                        .bucket(MinioConstantProperties.BUCKET_NAME)
                        //存入到minio桶内的文件路径+文件名称
                        .object(fileName)
                        //配置要上传的文件流
                        .stream(file.getInputStream() , file.getSize(), -1)
                .build());
        //3、返回上传成功的文件路径
        // minio的endpoint+ bucketName+ fileName
//        String path = minioConstantProperties.getEndpointUrl()
//                +"/"+minioConstantProperties.getBucketName()
//                + "/"+ fileName;
        String path = MinioConstantProperties.ENDPOINT_URL
                +"/"+MinioConstantProperties.BUCKET_NAME
                + "/"+ fileName;
        return Result.ok(path);
    }



}
